/*
 * Copyright 2000-2020 ALPHA LAB.Inc All Rights Reserved.
 */
package com.alphalab.framework.role;

import java.io.Serializable; 
import java.util.List; 
import com.alphalab.framework.dao.IEntityDao; 
import com.alphalab.framework.domain.AbstractValueObject;
import com.alphalab.framework.domain.AbstractValueObjectTransfer;
import com.alphalab.framework.domain.BaseEntity;
import com.alphalab.framework.domain.DataModelState;
import com.alphalab.framework.exception.MoServiceException;
import com.alphalab.framework.types.MoErrorCodeEnum;

/**
 * 对数据对象的业务逻辑处理，属于业务逻辑层.
 * 表示由Role来扮演操作数据的角色，主要处理增删改及基本查询.
 * @param <VO> 
 * @param <PO> 
 * @param <DAO> 
 * @param <TRANSFER>
 * @author allen
 * @version 1.0.0 2017年8月15日
 */
public class GeneralRole<VO extends AbstractValueObject, PO extends BaseEntity, DAO 
	extends IEntityDao<PO>, TRANSFER 
	extends AbstractValueObjectTransfer<VO, PO>> implements IGeneralRole<VO> {

	/**
	 * POVO转换器entityTransfer.
	 */	
	private TRANSFER entityTransfer;
	/**
	 * generalQueryDao.
	 */	
	private DAO entityDao;
	
	/**
	 * 手动注入entityDao实现.
	 * @param newentityDao entityDao
	 */
	public void setEntityDao(final DAO newentityDao) {
		this.entityDao = newentityDao;
	}

	/**
	 * 获取entityDao.
	 * @return entityDao
	 */		
	public IEntityDao getEntityDao() {
		return this.entityDao;
	}	
	
	/**
	 * 手动注入transfer.
	 * @param transfer transfer
	 */
	public void setEntityTransfer(final TRANSFER transfer) {
		this.entityTransfer = transfer;
	}

	/**
	 * 获取transfer.
	 * @return TRANSFER
	 */	
	public TRANSFER getEntityTransfer() {
		if (this.entityTransfer == null) {
			throw new MoServiceException(MoErrorCodeEnum.ERROR_UNABLE_GET_ENTITY_TRANSFER.getCode(),
					MoErrorCodeEnum.ERROR_UNABLE_GET_ENTITY_TRANSFER.getMsg());
		}
		return this.entityTransfer;
	}

	/**
	 * 保存VO对象.
	 * @param valueObject VO对象
	 * @return int
	 */
	@Override
	public int save(final VO valueObject) {
		getEntityDao().save(getEntityTransfer().toPO(valueObject));
		return 1;
	}

	/**
	 * 保存VO对象集合.
	 * @param valueObjects VO对象集合
	 * @return int
	 */
	@Override
	public int saveList(final List<VO> valueObjects) {
		getEntityDao().save(getEntityTransfer().toPO(valueObjects));
		return valueObjects.size();
	}

	/**
	 * 删除VO对象.
	 * @param valueObject VO对象
	 * @return int
	 */
	@Override
	public int delete(final VO valueObject) {
		getEntityDao().delete(getEntityTransfer().toPO(valueObject));
		return 1;
	}

	/**
	 * 删除VO对象.
	 * @param id 主键
	 * @return int
	 */
	@Override
	public int deleteById(final Serializable id) {
		getEntityDao().delete(id);
		return 1;
	}

	/**
	 * 删除VO对象集合.
	 * @param valueObjects VO对象集合
	 * @return int
	 */
	@Override
	public int deleteList(final List<VO> valueObjects) {
		getEntityDao().delete(getEntityTransfer().toPO(valueObjects));
		return valueObjects.size();
	}

	/**
	 * 更新VO对象.
	 * @param valueObject VO对象
	 * @return int
	 */
	@Override
	public int update(final VO valueObject) {
		getEntityDao().update(getEntityTransfer().toPO(valueObject));
		return 1;
	}

	/**
	 * 更新VO对象集合.
	 * @param valueObjects VO对象集合
	 * @return int
	 */
	@Override
	public int updateList(final List<VO> valueObjects) {
		getEntityDao().update(getEntityTransfer().toPO(valueObjects));
		return valueObjects.size();
	}

	/**
	 * 保存或更新VO对象.
	 * @param valueObject VO对象
	 * @return int
	 */
	@Override
	public int saveOrUpdate(final VO valueObject) { 
		final int state = valueObject.getModelState();
		if (DataModelState.isNew(state)) {
			save(valueObject);
		} else if (DataModelState.isModify(state)) {
			update(valueObject);
		}
		return 1;
	}

	/**
	 * 保存或更新VO对象集合.
	 * @param valueObjects VO对象集合
	 * @return int
	 */
	@Override
	public int saveOrUpdateList(final List<VO> valueObjects) {
		for (VO vo : valueObjects) {
			saveOrUpdate(vo);
		}
		return valueObjects.size();
	}

	/**
	 * 根据主键返回对象.
	 * @param id 主键
	 * @return VO
	 */
	@Override
	public VO find(final Serializable id) {  
		return getEntityTransfer().toVO((PO) getEntityDao().find(id));
	}

	/**
	 * 根据sql执行并返回结果，需加事务才能生效.
	 * @param sql 完整的原生sql语句
	 * @return result 影响的行数
	 */
	@Override
	public int excecuteBySql(final String sql) { 
		return getEntityDao().excecuteBySql(sql);
	}	 
	
}
